Ensure that render nodes are translated
authorEmmanuele Bassi <ebassi@gnome.org>
Tue, 5 Jul 2016 10:58:44 +0000 (11:58 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:08 +0000 (11:49 +0100)
The clip rectangle may have non-zero offsets, so we need to ensure that
the GskRenderNode associated to the rendered area is translated by those
same offsets.

gtk/gtkwidget.c

index b16cf8bc6dec4d42152a5fc5aa575ada71f08cd6..39c8910bd22e72d3b7342027e5af2280ac671f76 100644 (file)
@@ -15845,19 +15845,23 @@ gtk_widget_get_render_node (GtkWidget   *widget,
 {
   GtkWidgetClass *klass = GTK_WIDGET_GET_CLASS (widget);
   GskRenderNode *node;
+  graphene_matrix_t m;
+  graphene_point3d_t tmp;
+  graphene_rect_t bounds;
+  GtkAllocation clip;
+
+  gtk_widget_get_clip (widget, &clip);
+  graphene_rect_init (&bounds, 0, 0, clip.width, clip.height);
+  graphene_matrix_init_translate (&m, graphene_point3d_init (&tmp, clip.x, clip.y, 0.f));
 
   if (klass->get_render_node == NULL)
     {
       GskRenderNode *tmp;
-      graphene_rect_t bounds;
-      GtkAllocation clip;
       cairo_t *cr;
 
-      gtk_widget_get_clip (widget, &clip);
-      graphene_rect_init (&bounds, clip.x, clip.y, clip.width, clip.height);
-
       tmp = gsk_render_node_new ();
       gsk_render_node_set_bounds (tmp, &bounds);
+      gsk_render_node_set_transform (tmp, &m);
       cr = gsk_render_node_get_draw_context (tmp);
 
       gtk_widget_draw (widget, cr);
@@ -15874,16 +15878,12 @@ gtk_widget_get_render_node (GtkWidget   *widget,
           g_signal_has_handler_pending (widget, widget_signals[DRAW], 0, FALSE))
         {
           GskRenderNode *tmp;
-          graphene_rect_t bounds;
-          GtkAllocation clip;
           gboolean result;
           cairo_t *cr;
 
-          gtk_widget_get_clip (widget, &clip);
-          graphene_rect_init (&bounds, clip.x, clip.y, clip.width, clip.height);
-
           tmp = gsk_render_node_new ();
           gsk_render_node_set_bounds (tmp, &bounds);
+          gsk_render_node_set_transform (tmp, &m);
           cr = gsk_render_node_get_draw_context (tmp);
 
           if (g_signal_has_handler_pending (widget, widget_signals[DRAW], 0, FALSE))